
Swagger2Markup bug-生成的 html 文档有问题当 ApiModel value 包含斜线
错误描述
此问题的由来是因为某天看用 asciidoctor-maven-plugin 生成的 swagger html 文档时, 发现有个链接没法跳转到指定的 header.如下图所示:

经过排查发现是因为 ApiModel 的 value 包含 / 时会出现问题.以上面的问题为例, 写了一个简单的示例, 如下:
Controller 有一个方法:
1 | (value= "...", method = RequestMethod.POST) |
Order 类定义如下:
1 | // 带有斜线 / |
错误排查
首先查看生成的 html 文件:
1 | // 跳转链接的 ID 是 _create_order |

进一步排查生成的 .adoc 文件.在 paths.adoc、definitions.adoc 文件中搜索 create_order 相关的信息.
paths.adoc 内容如下:
1 | ==== Parameters |
definitions.adoc 内容如下:
1 | [[_order_create_order]] |
很明显, 这两个 ID 是不一样的.就导致了生成的 html 文档也有问题.
这会导致如下两个问题:
- 链接无法跳转到指定的 header
- 请求/响应示例无法生成
错误原因分析
针对上面的两个问题, 分别做下错误原因分析:
链接无法跳转到指定的 header:
GenericRef类有两个属性,ref和simpleRef.以上面的例子为例(order/create_order),ref是#/definitions/order/create_order,simpleRef是create_order.simpleRef不包含order前缀.所以在生成链接 id 的时候, 可能是一个使用了simpleRef, 另外一个使用了ref, 所以应该统一使用其中一个.请求/响应示例无法生成:
Swagger#getDefinitions()方法返回的是Map<String, Model>, 这个 map 里面包含了/order/create_order, 但是不包含create_order, 所以当生成示例的时候, 可能是使用的simpleRef从 map 中获取Model对象(此时肯定获取不到).如果使用ref(去除#/definitions/前缀)可以从 map 中获取Model对象, 所以应该先使用simpleRef, 如果获取不到Model, 再使用ref.
- 感谢您的阅读,本文由 ykgarfield 版权所有。如若转载,请注明出处:ykgarfield
- 文章链接: https://ykgarfield.github.io/2019/01/01/文档工具/swagger/Swagger2Markup bug-生成的 html 文档有问题当 ApiModel value 包含斜线/